// 组件: zj-radio-group 单选组
// ==================== 参数 ====================
// ※ value ==> 当前值
// ※ model ==> 双向绑定时父组件的键名
// ※ options ==> 数据列表 (默认: [])
// ※ valKey ==> 当数据列表为 Object Array 时, 当前值的键名 (默认: 'id')
// ※ labKey ==> 当数据列表为 Object Array 时, 显示值的键名 (默认: 'name')
// ※ disabled ==> 是否禁用 (默认: false)
// ==================== 事件 ====================
// ※ bind:model="model(e)" ==> 双向绑定
// ※ bind:change="change(e)" ==> 选择器值改变时
// ==================== 插槽 slot ====================
// ※ 默认插槽 ==> xxxxx
// ※ xxxxx ==> xxxxx
// ==================== 方法 ====================
// ※ xxxxx ==> xxxxx

Component({
  properties: {
    value: { // 当前值
      type: String
    },
    model: { // 双向绑定时父组件的键名
      type: String
    },
    options: { // 数据列表
      type: Array,
      value: []
    },
    valKey: { // 当数据列表为 Object Array 时, 当前值的键名
      type: String,
      value: 'id'
    },
    labKey: { // 当数据列表为 Object Array 时, 显示值的键名
      type: String,
      value: 'name'
    },
    disabled: { // 是否禁用
      type: Boolean
    }
  },
  data: {
    ind: null, // 当前索引
    // ========== 判断 ==========
    judge_isObj: false // options[0]是否为object
  },
  observers: {
    // ========== 监听'当前值', 判断placeholder是否显示 ==========
    'value': function (value) {
      const ind = this.findIndex(this.properties.value)
      this.setData({ ind })
    },
    // ========== 监听'options', options[0]是否为object ==========
    'options': function (options) {
      this.setData({
        judge_isObj: Boolean(typeof(options[0]) === 'object'),
        value: this.properties.value
      })
    }
  },
  methods: {
    // ========== 数组找下标 ==========
    findIndex (val) {
      const options = this.properties.options
      const valKey = this.properties.valKey
      let result = null
      if (this.data.judge_isObj) {
        result = options.findIndex(b => b[valKey] === val || b[valKey] + '' === val)
      } else {
        result = options.findIndex(b => b === val || b + '' === val)
      }
      return result
    },
    // ========== 值改变时 ==========
    change (e) {
      const index = e.currentTarget.dataset.index
      if (index === this.data.ind) {
        return
      }
      this.setData({ ind: index })
      // 获取当前值
      const options = this.properties.options
      const valKey = this.properties.valKey
      const judge_isObj = this.data.judge_isObj
      e.currentTarget.dataset.model = this.properties.model
      e.detail.value = judge_isObj ? options[index][valKey] : options[index]
      this.triggerEvent('model', e)
      this.triggerEvent('change', e)
    }
  }
})
